#pragma once
#include <iostream>
#include <string>
#include <fstream> //文件操作

// 工具类
class Util
{
public:
    // 读取文件内容的方法
    static bool ReadFileContent(const std::string &filename, std::string *out)
    {
        // version1:默认是以文本方式读文件的，图片、视频都是二进制的
        // std::ifstream in(filename);
        // if (!in.is_open())
        // {
        //     return false;
        // }
        // // 文件打开成功
        // // 对文件进行读取
        // std::string line;
        // while (getline(in, line))
        // {
        //     *out += line;
        // }

        // in.close();

        // version2:以二进制方式进行读取
        int filesize = FileSize(filename); // 获取一下目标文件的大小
        if (filesize > 0)
        {
            // 获取成功
            std::ifstream in(filename);
            if (!in.is_open())
            {
                return false;
            }

            // 以目标文件大小来进行二进制读取文件内容到out中
            out->resize(filesize);
            in.read((char *)out->c_str(), filesize);

            in.close();
        }
        else
        {
            return false;
        }

        return true;
    }

    // 分割大字符串一行的方法
    // 参数1：大字符串，参数2：将分割好的这一行返回出去的参数，参数3：分隔符
    static bool ReadOneLine(std::string &bigstr, std::string *out, std::string &sep)
    {
        auto pos = bigstr.find(sep);
        if (pos == std::string::npos) // 没有换行符，这个请求字符串连一行都没
        {
            return false;
        }
        *out = bigstr.substr(0, pos);      // 提取一行
        bigstr.erase(0, pos + sep.size()); // 删除这一行
        return true;
    }

    // 返回文件的长度大小的方法
    static int FileSize(const std::string &filename)
    {
        std::ifstream in(filename, std::ios::binary); // 以二进制字节流打开
        if (!in.is_open())
        {
            return -1; // 打开文件失败
        }

        in.seekg(0, in.end);
        int filesize = in.tellg();
        in.seekg(0, in.beg);
        in.close();

        return filesize;
    }
};